home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / PASCAL / 0187.ZIP / BACCARAT.PAS < prev    next >
Pascal/Delphi Source File  |  1985-01-20  |  6KB  |  277 lines

  1. (*
  2.  * baccarat
  3.  * plays the card game of baccarat
  4.  *)
  5.  
  6. program baccarat (input, output);
  7.  
  8. const
  9.    decksize   = 416;     (* size of 8 decks *)
  10.    start      = 10000;   (* the amount of money you start with *)
  11.  
  12. type
  13.    suittype  = (hearts,clubs,diamonds,spades);
  14.    card = record
  15.       value : 1..13;
  16.       suit  : suittype
  17.    end;
  18.    handvalue = 0..9;
  19.    decktype = 1..decksize;
  20.    stand    = set of handvalue;
  21.  
  22. var
  23.    cardnum   : decktype;     (* current card we are playing *)
  24.    deck      : array [decktype] of card; (* the deck *)
  25.    bankhand  : handvalue;    (* the banker's hand *)
  26.    playhand  : handvalue;    (* the player's hand *)
  27.    comphand  : handvalue;    (*value of the computer's hand *)
  28.    humhand   : handvalue;    (* the value of the human's hand *)
  29.    compmoney : integer;      (* the computer's money *)
  30.    hummoney  : integer;      (* the player's money *)
  31.    bet       : integer;      (* the size of the bet *)
  32.    ch        : char;         (* used to answer questions *)
  33.    compbank  : boolean;      (* whether the computer is the banker *)
  34.  
  35. (*
  36.  * makedeck
  37.  * create the deck
  38.  *)
  39.  
  40. procedure makedeck;
  41.  
  42. var
  43.    decknum : decktype;
  44.    suit    : suittype;
  45.    value   : 1..13;
  46.  
  47. begin
  48.    suit := hearts;
  49.    for decknum := 1 to decksize do
  50.    begin
  51.       deck[decknum].value := decknum mod 13 + 1;
  52.       deck[decknum].suit := suit;
  53.       if deck[decknum].value = 13 then
  54.          if suit <> spades then
  55.             suit := succ(suit)
  56.          else
  57.             suit := hearts
  58.    end
  59. end;
  60.  
  61. (*
  62.  * shuffle
  63.  * go through the deck exchanging cards
  64.  *)
  65.  
  66. procedure shuffle;
  67.  
  68. var
  69.    tmp : card;
  70.    decknum,
  71.    newnum : decktype;
  72.  
  73. begin
  74.    cardnum := 1;
  75.    for decknum := 1 to decksize do
  76.    begin
  77.       newnum := random(decksize) + 1;
  78.       tmp := deck[newnum];
  79.       deck[newnum] := deck[decknum];
  80.       deck[decknum] := tmp
  81.    end
  82. end;
  83.  
  84. (*
  85.  * showcard
  86.  * prints out a card in a readable format
  87.  *)
  88.  
  89. procedure showcard (display:card);
  90.  
  91. begin
  92.    case display.value of
  93.       1: write('Ace  ');
  94.       2,3,4,5,6,7,8,9: write(display.value:1,'    ');
  95.       10: write('Ten  ');
  96.       11: write('Jack ');
  97.       12: write('Queen');
  98.       13: write('King ')
  99.    end;
  100.    write(' of ');
  101.    case display.suit of
  102.       hearts   : write('Hearts  ');
  103.       diamonds : write('Diamonds');
  104.       clubs    : write('Clubs   ');
  105.       spades   : write('Spades  ')
  106.    end;
  107.    write('     ')
  108. end;
  109.  
  110. (*
  111.  * play
  112.  * deal the cards, then decide if we need to  ake any cards
  113.  *)
  114.  
  115. procedure play;
  116.  
  117. var
  118.    stood : boolean;   (* if the player stood *)
  119.  
  120. (*
  121.  * cardeal
  122.  * actually deals a card out
  123.  *)
  124.  
  125. procedure cardeal(var addto:handvalue);
  126.  
  127. begin
  128.    showcard(deck[cardnum]);
  129.    if deck[cardnum].value <= 9 then
  130.       addto := (addto + deck[cardnum].value) mod 10;
  131.    cardnum := cardnum + 1
  132. end;
  133.  
  134. (*
  135.  * bankdeal
  136.  * decide if the bank should have a card dealt to it
  137.  *)
  138.  
  139. function bankdeal: boolean;
  140.  
  141. var
  142.    lastval : 0..9;    (* the value of the last card *)
  143.  
  144. begin
  145.    if deck[cardnum - 1].value >= 10 then
  146.       lastval := 0
  147.    else
  148.       lastval := deck[cardnum-1].value;
  149.    bankdeal := true;
  150.    case lastval of
  151.       0,9: if bankhand >= 4 then
  152.               bankdeal := false;
  153.       8:   if bankhand >= 3 then
  154.               bankdeal := false;
  155.       7,6: if bankhand = 7 then
  156.               bankdeal := false;
  157.       5,4: if bankhand >= 6 then
  158.               bankdeal := false;
  159.       3,2: if bankhand >= 5 then
  160.               bankdeal := false;
  161.       1:   if bankhand >= 4 then
  162.               bankdeal := false
  163.    end
  164. end;
  165.  
  166. begin
  167.    stood := true;
  168.    bankhand := 0;
  169.    playhand := 0;
  170.    if cardnum > (decksize - 7) then
  171.       shuffle;
  172.    writeln('Player''s hand        Banker''s hand');
  173.    cardeal(playhand);
  174.    cardeal(bankhand);
  175.    writeln;
  176.    cardeal(playhand);
  177.    cardeal(bankhand);
  178.    writeln;
  179.    if (bankhand >= 8) or (playhand >= 8) then
  180.       writeln('Natural')
  181.    else
  182.    begin
  183.       if playhand <= 5 then
  184.       begin
  185.          stood := false;
  186.          writeln('The player must take a card');
  187.          cardeal(playhand)
  188.       end;
  189.       writeln;
  190.       if stood then
  191.       begin
  192.          if bankhand < 6 then
  193.          begin
  194.             writeln('The banker must take a card');
  195.             cardeal(bankhand)
  196.          end
  197.       end
  198.       else
  199.          if bankdeal then
  200.          begin
  201.             writeln('The banker must take a card');
  202.             cardeal(bankhand)
  203.          end;
  204.       writeln
  205.    end;
  206.    writeln('The player''s total is ',playhand);
  207.    writeln('The banker''s total is ',bankhand)
  208. end;
  209.  
  210. begin
  211.    randomize;
  212.    compmoney := start;
  213.    hummoney := start;
  214.    makedeck;
  215.    cardnum := decksize;
  216.    while (ch <> 'n') and (ch <> 'N') do
  217.    begin
  218.       while not (ch in ['p','P','b','B']) do
  219.       begin
  220.          write('Do you want to be the banker, or player? ');
  221.          readln(ch)
  222.       end;
  223.       writeln;
  224.       if (ch = 'p') or (ch = 'P') then
  225.       begin
  226.          write('Bet? ');
  227.          readln(bet)
  228.       end
  229.       else
  230.       begin
  231.          (*
  232.           * the computer is the player so it makes a random bet
  233.           *)
  234.          bet := random(start) + 10;
  235.          bet := bet div 10;
  236.          bet := bet * 10;
  237.          writeln('The bet is ',bet)
  238.       end;
  239.       play;
  240.       randomize;
  241.       if (ch = 'b') or (ch = 'B') then
  242.       begin
  243.         comphand := playhand;
  244.         humhand  := bankhand
  245.       end
  246.       else
  247.       begin
  248.          comphand := bankhand;
  249.          humhand  := playhand
  250.       end;
  251.       if bankhand = playhand then
  252.          writeln('Tie')
  253.       else
  254.       begin
  255.          if comphand > humhand then
  256.          begin
  257.             writeln('The computer has won');
  258.             compmoney := compmoney + bet;
  259.             hummoney  := hummoney  - bet
  260.          end
  261.          else
  262.          begin
  263.             write('You won!!!');
  264.             compmoney := compmoney - bet;
  265.             hummoney  := hummoney  + bet
  266.          end
  267.       end;
  268.       writeln;
  269.       writeln('Totals are:');
  270.       writeln('Computer has ',compmoney);
  271.       writeln('You have ',hummoney);
  272.       writeln;
  273.       write('Wast to try again? ');
  274.       readln(ch)
  275.    end;
  276. end.
  277.